package br.com.foxinline.modelo;

import br.com.foxinline.enums.Nacionalidade;
import br.com.foxinline.enums.TipoProfissional;
import br.com.foxinline.enums.TipoSUS;
import br.com.foxinline.validador.CPF;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author laverson
 */
@Entity
public class Profissional implements Serializable {

    @Id
    @SequenceGenerator(sequenceName = "seq_profissional", name = "seq_profissional", allocationSize = 1)
    @GeneratedValue(generator = "seq_profisional", strategy = GenerationType.SEQUENCE)
    private Long id;
    private String nome;
    private String codigoCNES;
    @Enumerated(EnumType.STRING)
    private TipoSUS tipoSUS;
    private String nomeMae;
    private String nomePai;
    private String numeroPortaria;
    private Integer pisPasep;
    @Enumerated(EnumType.STRING)
    private Nacionalidade nacionalidade;
    @Enumerated(EnumType.STRING)
    private TipoProfissional tipoProfissional;
    @OneToMany
    private List<VinculoEmpregaticio> vinculoEmpregaticios;
    @CPF
    private String cpf;
    private String rg;
    private String orgaoEmissor;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataNascimento;
    private String numeroCartaoSus;
    @OneToOne(cascade = CascadeType.ALL)
    private Endereco endereco;
    @ManyToOne
    private MicroArea microArea;
    @ManyToOne
    private Equipe equipe;
    private Boolean ativo = true;
    @Version
    private int versao;

    public Profissional() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCodigoCNES() {
        return codigoCNES;
    }

    public void setCodigoCNES(String codigoCNES) {
        this.codigoCNES = codigoCNES;
    }

    public String getNumeroCartaoSus() {
        return numeroCartaoSus;
    }

    public void setNumeroCartaoSus(String numeroCartaoSus) {
        this.numeroCartaoSus = numeroCartaoSus;
    }

    public TipoSUS getTipoSUS() {
        return tipoSUS;
    }

    public void setTipoSUS(TipoSUS tipoSUS) {
        this.tipoSUS = tipoSUS;
    }

    public String getNomeMae() {
        return nomeMae;
    }

    public void setNomeMae(String nomeMae) {
        this.nomeMae = nomeMae;
    }

    public String getNomePai() {
        return nomePai;
    }

    public void setNomePai(String nomePai) {
        this.nomePai = nomePai;
    }

    public String getNumeroPortaria() {
        return numeroPortaria;
    }

    public void setNumeroPortaria(String numeroPortaria) {
        this.numeroPortaria = numeroPortaria;
    }

    public Integer getPisPasep() {
        return pisPasep;
    }

    public void setPisPasep(Integer pisPasep) {
        this.pisPasep = pisPasep;
    }

    public Nacionalidade getNacionalidade() {
        return nacionalidade;
    }

    public void setNacionalidade(Nacionalidade nacionalidade) {
        this.nacionalidade = nacionalidade;
    }

    public TipoProfissional getTipoProfissional() {
        return tipoProfissional;
    }

    public void setTipoProfissional(TipoProfissional tipoProfissional) {
        this.tipoProfissional = tipoProfissional;
    }

    public List<VinculoEmpregaticio> getVinculoEmpregaticios() {
        return vinculoEmpregaticios;
    }

    public void setVinculoEmpregaticios(List<VinculoEmpregaticio> vinculoEmpregaticios) {
        this.vinculoEmpregaticios = vinculoEmpregaticios;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getOrgaoEmissor() {
        return orgaoEmissor;
    }

    public void setOrgaoEmissor(String orgaoEmissor) {
        this.orgaoEmissor = orgaoEmissor;
    }

    public Date getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public MicroArea getMicroArea() {
        return microArea;
    }

    public void setMicroArea(MicroArea microArea) {
        this.microArea = microArea;
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    public Equipe getEquipe() {
        return equipe;
    }

    public void setEquipe(Equipe equipe) {
        this.equipe = equipe;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 97 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        hash = 97 * hash + (this.codigoCNES != null ? this.codigoCNES.hashCode() : 0);
        hash = 97 * hash + (this.tipoSUS != null ? this.tipoSUS.hashCode() : 0);
        hash = 97 * hash + (this.nomeMae != null ? this.nomeMae.hashCode() : 0);
        hash = 97 * hash + (this.nomePai != null ? this.nomePai.hashCode() : 0);
        hash = 97 * hash + (this.numeroPortaria != null ? this.numeroPortaria.hashCode() : 0);
        hash = 97 * hash + (this.pisPasep != null ? this.pisPasep.hashCode() : 0);
        hash = 97 * hash + (this.nacionalidade != null ? this.nacionalidade.hashCode() : 0);
        hash = 97 * hash + (this.tipoProfissional != null ? this.tipoProfissional.hashCode() : 0);
        hash = 97 * hash + (this.vinculoEmpregaticios != null ? this.vinculoEmpregaticios.hashCode() : 0);
        hash = 97 * hash + (this.cpf != null ? this.cpf.hashCode() : 0);
        hash = 97 * hash + (this.rg != null ? this.rg.hashCode() : 0);
        hash = 97 * hash + (this.orgaoEmissor != null ? this.orgaoEmissor.hashCode() : 0);
        hash = 97 * hash + (this.dataNascimento != null ? this.dataNascimento.hashCode() : 0);
        hash = 97 * hash + (this.numeroCartaoSus != null ? this.numeroCartaoSus.hashCode() : 0);
        hash = 97 * hash + (this.endereco != null ? this.endereco.hashCode() : 0);
        hash = 97 * hash + (this.equipe != null ? this.equipe.hashCode() : 0);
        hash = 97 * hash + (this.ativo != null ? this.ativo.hashCode() : 0);
        hash = 97 * hash + this.versao;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Profissional other = (Profissional) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
         if ((this.codigoCNES == null) ? (other.codigoCNES != null) : !this.codigoCNES.equals(other.codigoCNES)) {
            return false;
        }
       
        if (this.tipoSUS != other.tipoSUS) {
            return false;
        }
        if ((this.nomeMae == null) ? (other.nomeMae != null) : !this.nomeMae.equals(other.nomeMae)) {
            return false;
        }
        if ((this.nomePai == null) ? (other.nomePai != null) : !this.nomePai.equals(other.nomePai)) {
            return false;
        }
        if ((this.numeroPortaria == null) ? (other.numeroPortaria != null) : !this.numeroPortaria.equals(other.numeroPortaria)) {
            return false;
        }
        if (this.pisPasep != other.pisPasep && (this.pisPasep == null || !this.pisPasep.equals(other.pisPasep))) {
            return false;
        }
        if (this.nacionalidade != other.nacionalidade) {
            return false;
        }
        if (this.tipoProfissional != other.tipoProfissional) {
            return false;
        }
        if (this.vinculoEmpregaticios != other.vinculoEmpregaticios && (this.vinculoEmpregaticios == null || !this.vinculoEmpregaticios.equals(other.vinculoEmpregaticios))) {
            return false;
        }
        if ((this.cpf == null) ? (other.cpf != null) : !this.cpf.equals(other.cpf)) {
            return false;
        }
        if ((this.rg == null) ? (other.rg != null) : !this.rg.equals(other.rg)) {
            return false;
        }
        if ((this.orgaoEmissor == null) ? (other.orgaoEmissor != null) : !this.orgaoEmissor.equals(other.orgaoEmissor)) {
            return false;
        }
        if (this.dataNascimento != other.dataNascimento && (this.dataNascimento == null || !this.dataNascimento.equals(other.dataNascimento))) {
            return false;
        }
        if ((this.numeroCartaoSus == null) ? (other.numeroCartaoSus != null) : !this.numeroCartaoSus.equals(other.numeroCartaoSus)) {
            return false;
        }
        if (this.endereco != other.endereco && (this.endereco == null || !this.endereco.equals(other.endereco))) {
            return false;
        }
        if (this.equipe != other.equipe && (this.equipe == null || !this.equipe.equals(other.equipe))) {
            return false;
        }
        if (this.ativo != other.ativo && (this.ativo == null || !this.ativo.equals(other.ativo))) {
            return false;
        }
        if (this.versao != other.versao) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Profissional{" + "id=" + id + ", nome=" + nome + ", cnes=" + codigoCNES + ", tipoSUS=" + tipoSUS + ", nomeMae=" + nomeMae + ", nomePai=" + nomePai + ", numeroPortaria=" + numeroPortaria + ", pisPasep=" + pisPasep + ", nacionalidade=" + nacionalidade + ", tipoProfissional=" + tipoProfissional + ", vinculoEmpregaticios=" + vinculoEmpregaticios + ", cpf=" + cpf + ", rg=" + rg + ", orgaoEmissor=" + orgaoEmissor + ", dataNascimento=" + dataNascimento + ", numSus=" + numeroCartaoSus + ", endereco=" + endereco + ", microArea=" + microArea + ", ativo=" + ativo + ", versao=" + versao + '}';
    }
}
